AWS CDK のアルファモジュールで AWS IoT Device Defender の監査が簡単に構成可能になりました

AWS CDK のアルファモジュールで AWS IoT Device Defender の監査が簡単に構成可能になりました

Clock Icon2024.10.19

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最近のリリースである v2.162.0 で、下記のアップデートが追加されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.162.0

iot-alpha: support for account audit configuration (#31661) (fc19571), closes #31663

AWS IoT では、AWS IoT Device Defender を利用することで、IoT デバイスのセキュリティを監視し、不正なアクティビティを検出することができます。

そして Device Defender の主たる機能の 1 つであるアカウントの 監査(audit) の構成を作成すると、監査チェック項目ごとに、IoT デバイスやアカウント設定のセキュリティ上のプラクティスに対する準拠状況を監視することができます。

https://docs.aws.amazon.com/ja_jp/iot-device-defender/latest/devguide/device-defender-audit.html

そして今回の AWS CDK のアップデートにより、アルファモジュール(aws-iot-alpha)でその AWS IoT Device Defender のアカウント監査構成が L2 Construct により簡単に作成可能になりました。

試してみた

CDK パッケージのアップデート

AWS CDK モジュールを v2.162.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest @aws-cdk/aws-iot-alpha@latest

アカウント監査構成の作成

CDK 実装

L2 Construct である AccountAuditConfiguration を使用して、アカウント監査構成を作成します。通知先として SNS トピックを指定します。

lib/sample-app-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as iot from '@aws-cdk/aws-iot-alpha';
import * as sns from 'aws-cdk-lib/aws-sns';
import { Construct } from 'constructs';

export class SampleApp extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // 監査通知先の SNS トピック
    const targetTopic = new sns.Topic(this, 'TargetTopic');

    // IoT アカウント監査設定
    new iot.AccountAuditConfiguration(this, 'AuditConfiguration', {
      targetTopic,
    });
  }
}

CDK Diff は次のようになります。アカウント監査構成の作成と、監査用およびトピック通知用サービスロールの作成、ポリシーのアタッチが行われます。監査用ロールには AWSIoTDeviceDefenderAudit というマネージドポリシーがアタッチされます。

$ npx cdk diff SampleApp
start: Building d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
success: Built d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
start: Publishing d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
success: Published d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack SampleApp
IAM Statement Changes
┌───┬────────────────────────────────────────────┬────────┬────────────────┬────────────────────────────────────────────┬───────────┐
│   │ Resource                                   │ Effect │ Action         │ Principal                                  │ Condition │
├───┼────────────────────────────────────────────┼────────┼────────────────┼────────────────────────────────────────────┼───────────┤
│ + │ ${AuditConfiguration/AuditRole.Arn}        │ Allow  │ sts:AssumeRole │ Service:iot.amazonaws.com                  │           │
├───┼────────────────────────────────────────────┼────────┼────────────────┼────────────────────────────────────────────┼───────────┤
│ + │ ${AuditConfiguration/NotificationRole.Arn} │ Allow  │ sts:AssumeRole │ Service:iot.amazonaws.com                  │           │
├───┼────────────────────────────────────────────┼────────┼────────────────┼────────────────────────────────────────────┼───────────┤
│ + │ ${TargetTopic}                             │ Allow  │ sns:Publish    │ AWS:${AuditConfiguration/NotificationRole} │           │
└───┴────────────────────────────────────────────┴────────┴────────────────┴────────────────────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬─────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────┐
│   │ Resource                        │ Managed Policy ARN                                                           │
├───┼─────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────┤
│ + │ ${AuditConfiguration/AuditRole} │ arn:${AWS::Partition}:iam::aws:policy/service-role/AWSIoTDeviceDefenderAudit │
└───┴─────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Resources
[+] AWS::IAM::Role AuditConfiguration/AuditRole AuditConfigurationAuditRole0FFA1461
[+] AWS::IAM::Role AuditConfiguration/NotificationRole AuditConfigurationNotificationRole9774BAD4
[+] AWS::IoT::AccountAuditConfiguration AuditConfiguration AuditConfiguration8C793652

✨  Number of stacks with differences: 1

デプロイ

マネジメントコンソールから確認した、デプロイ前のアカウント監査構成です。監査構成自体は作成済みで、各チェック項目が無効化さえrている状態です。

この状態で前述の CDK コードでデプロイを実行するとエラーとなってしまいました。どうやら既存の監査構成がある場合は、新たに作成することができないようです。

$ cdk deploy --require-approval never --method=direct SampleApp

✨  Synthesis time: 5.12s

SampleApp: start: Building d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
SampleApp: success: Built d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
SampleApp: start: Publishing d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
SampleApp: success: Published d18d50fc5186dc58c310b0f8e6799c4e28c17f6983506eabb1fbbc8a24ff6bcc:current_account-current_region
SampleApp: deploying... [1/1]
SampleApp: updating stack...
1:40:28 PM | CREATE_FAILED        | AWS::IoT::AccountAuditConfiguration | AuditConfiguration8C793652
Resource handler returned message: "The AccountAuditConfiguration already exists." (RequestToken: 2692ce0d-1d1f-f097-9c8d-2621dd28175c, HandlerErrorCode: AlreadyExists)

マネジメントコンソールからアカウント監査を無効化する方法が分からなかったので AWS CLI で削除します。

aws iot delete-account-audit-configuration

再度マネジメントコンソールから確認すると、アカウント監査構成が削除されていることが確認できました。

改めて CDK デプロイを実行すると今度は成功しました。マネジメントコンソールを確認すると、監査構成が作成されていることが確認できました。

個別の監査チェック項目の設定

デフォルトでは、アカウント監査構成は全ての監査チェック項目が有効化されますが、個別の監査チェック項目の有効化および無効化を行うこともできます。

CDK 実装

個別の監査チェック項目の有効化および無効化を行うには、checkConfiguration プロパティに対象のチェック項目を指定します。

lib/sample-app-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as iot from '@aws-cdk/aws-iot-alpha'
import * as sns from 'aws-cdk-lib/aws-sns';
import { Construct } from 'constructs';

export class SampleApp extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // 監査通知先の SNS トピック
    const targetTopic = new sns.Topic(this, 'TargetTopic');

    // IoT アカウント監査設定
    new iot.AccountAuditConfiguration(this, 'AuditConfiguration', {
      targetTopic,
      checkConfiguration: {
        // true による明示的な有効化
        authenticatedCognitoRoleOverlyPermissiveCheck: true,
        // undefined によるデフォルトの有効化
        caCertificateExpiringCheck: undefined,
        // false による無効化
        caCertificateKeyQualityCheck: false,
        conflictingClientIdsCheck: false,
        deviceCertificateExpiringCheck: false,
        deviceCertificateKeyQualityCheck: false,
        deviceCertificateSharedCheck: false,
        intermediateCaRevokedForActiveDeviceCertificatesCheck: false,
        ioTPolicyPotentialMisConfigurationCheck: false,
        iotPolicyOverlyPermissiveCheck: false,
        iotRoleAliasAllowsAccessToUnusedServicesCheck: false,
        iotRoleAliasOverlyPermissiveCheck: false,
        loggingDisabledCheck: false,
        revokedCaCertificateStillActiveCheck: false,
        revokedDeviceCertificateStillActiveCheck: false,
        unauthenticatedCognitoRoleOverlyPermissiveCheck: false,
      },
    });
  }
}

CDK Diff を確認すると、有効化した authenticatedCognitoRoleOverlyPermissiveCheck および caCertificateExpiringCheck 以外の監査チェック項目が無効化されることが確認できます。

$ npx cdk diff SampleApp
start: Building 5820307129b99279cf56dafd86aae750170340c17d70b0f04d0301cace1c1cb9:current_account-current_region
success: Built 5820307129b99279cf56dafd86aae750170340c17d70b0f04d0301cace1c1cb9:current_account-current_region
start: Publishing 5820307129b99279cf56dafd86aae750170340c17d70b0f04d0301cace1c1cb9:current_account-current_region
success: Published 5820307129b99279cf56dafd86aae750170340c17d70b0f04d0301cace1c1cb9:current_account-current_region
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack SampleApp
Resources
[~] AWS::IoT::AccountAuditConfiguration AuditConfiguration AuditConfiguration8C793652
 └─ [~] AuditCheckConfigurations
     ├─ [-] Removed: .CaCertificateKeyQualityCheck
     ├─ [-] Removed: .ConflictingClientIdsCheck
     ├─ [-] Removed: .DeviceCertificateExpiringCheck
     ├─ [-] Removed: .DeviceCertificateKeyQualityCheck
     ├─ [-] Removed: .DeviceCertificateSharedCheck
     ├─ [-] Removed: .IntermediateCaRevokedForActiveDeviceCertificatesCheck
     ├─ [-] Removed: .IoTPolicyPotentialMisConfigurationCheck
     ├─ [-] Removed: .IotPolicyOverlyPermissiveCheck
     ├─ [-] Removed: .IotRoleAliasAllowsAccessToUnusedServicesCheck
     ├─ [-] Removed: .IotRoleAliasOverlyPermissiveCheck
     ├─ [-] Removed: .LoggingDisabledCheck
     ├─ [-] Removed: .RevokedCaCertificateStillActiveCheck
     ├─ [-] Removed: .RevokedDeviceCertificateStillActiveCheck
     └─ [-] Removed: .UnauthenticatedCognitoRoleOverlyPermissiveCheck

✨  Number of stacks with differences: 1

CDK デプロイを行うと、監査チェック項目の有効および無効の設定が反映されたアカウント監査構成が作成されました。

おわりに

AWS CDK のアルファモジュールで AWS IoT Device Defender の監査が簡単に構成可能になったので試してみました。

まだアルファ版の機能ではありますが、L2 Construct でアカウント監査構成を作成できるのは便利ですね。

以前紹介したロギングといい、AWS IoT のセキュリティや監視周りの設定を CDK で簡単に構築できるようになってきているのは嬉しいです。

https://dev.classmethod.jp/articles/aws-cdk-simplifies-logging-setup-with-aws-iot-alpha-module/

参考

https://dev.classmethod.jp/articles/re-introduction-iot-2021-aws-iot-device-defender/

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.